/**
*  Copyright (c) 2011, Alex Theodoridis
*  All rights reserved.

*  Redistribution and use in source and binary forms, with
*  or without modification, are permitted provided that the
*  following conditions are met:
*  Redistributions of source code must retain the above
*  copyright notice, this list of conditions and the following disclaimer.
*  Redistributions in binary form must reproduce the above
*  copyright notice, this list of conditions and the following
*  disclaimer in the documentation and/or other materials
*  provided with the distribution.

*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
*  AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
*  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
*  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
*  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
*  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
*  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
*  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
*  ANY WAY OUT OF THE USE OF THIS SOFTWARE,
*  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*/

#ifndef IODataH
#define IODataH
#include <map>
#include <NeuralNetwork/NNException.h>

namespace nn {

template<class Var>
class NNSamplesSet {
private:
    std::map<unsigned int, Var> _inputs;
    std::map<unsigned int, Var> _outputs;

public:

    NNSamplesSet(unsigned int inputsNumber, unsigned int outputsNumber) {
        if (inputsNumber < 1) {
            throw NNException("Wrong argument inputsNumber", __FILE__, __LINE__ );
        }

        if (outputsNumber < 1) {
            throw NNException("Wrong argument outputsNumber", __FILE__, __LINE__ );
        }

        for (unsigned int i = 0; i < inputsNumber; i++) {
            if (_inputs.insert( std::make_pair(i, 0) ).second == false) {
                _inputs.clear();
                throw NNException("Input insert error", __FILE__, __LINE__ );
            }
        }

        for (unsigned int i = 0; i < outputsNumber; i++) {
            if ( !_outputs.insert( std::make_pair(i, 0) ).second ) {
                _inputs.clear();
                _outputs.clear();
                throw NNException("Input insert error", __FILE__, __LINE__ );
            }
        }
    }

    bool setInput(unsigned int inputId, Var input) {
        bool result = false;
        typename std::map<unsigned int, Var>::iterator curInput;
        curInput = _inputs.find(inputId);
        if (curInput != _inputs.end()) {
            curInput->second = input;
            result = true;
        }

        return result;
    }

    bool setOutput(unsigned int outputId, Var output) {
        typename std::map<unsigned int, Var>::iterator curOutput;
        curOutput = _outputs.find(outputId);
        if (curOutput == _outputs.end()) {
            return false;
        }

        curOutput->second = output;
        return true;
    }

    Var getOutput(unsigned int outputId) const {
        typename std::map<unsigned int, Var>::const_iterator curOutput;
        curOutput = _outputs.find(outputId);
        if (curOutput == _outputs.end()) {
            throw NNException("Wrong outputId", __FILE__, __LINE__ );
        }

        return curOutput->second;
    }

    unsigned int getInputsNumber(void) const {
        return _inputs.size();
    }

    unsigned int getOutputsNumber(void) const {
        return _outputs.size();
    }

    Var getInput(unsigned int inputId) const {
        typename std::map<unsigned int, Var>::const_iterator curInput;
        curInput = _inputs.find(inputId);
        if (curInput == _inputs.end()) {
            throw NNException("Wrong outputId", __FILE__, __LINE__ );
        }

        return curInput->second;
    }

    ~NNSamplesSet() throw () {
    }
};

}

#endif
// kate: indent-mode cstyle; space-indent on; indent-width 0; 
